package fsmCore;

import java.io.Serializable;
import java.util.Vector;

import javax.swing.JOptionPane;

public class Macchina implements Serializable {

	private static final long serialVersionUID = 1L;
	private Stato statoCorrente;
	private Stato statoIniziale;
	private Vector<Stato> listaStati;
	private Vector<Transizione> listaTransizioni;
	
	
	public Macchina(){
		listaTransizioni = new Vector<Transizione>();
		listaStati = new Vector<Stato>();
	}
	
	/*@ requires non_null s && 
	  @  (\forall int i; i < listaStati.length; s != listaStati.get(i)) 
	  @*/
	public void inserisciStato(Stato s){	

		listaStati.add(s);
		JOptionPane.showMessageDialog(null, s.getNome()+"\ne' stato aggiunto");
	}
	
	//@ requires non_null t 
	public void inserisciTransizione(Transizione t){
		listaTransizioni.add(t);
		JOptionPane.showMessageDialog(null, t.getNome()+"\ne' stata aggiunta");
	}
	
	
	//@ requires non_null statoCorrente 
	public Vector<Transizione> getTransizioniAttive(){
		Vector<Transizione> attiva = new Vector<Transizione>();
		
		// spazzolo tutte le transizioni
		for(int i=0; i < listaTransizioni.size(); i++){
			if(listaTransizioni.get(i).getSorgente().equals(statoCorrente)) // se la transizione parte dallo stato corrente
				attiva.add(listaTransizioni.get(i));
		}
		
		return attiva;
	}
	
	//@ requires listaTransizioni non_null
	public Vector<Transizione> getTransizioniSincrone(){
		Vector<Transizione> transizioniSincrone = new Vector<Transizione>();
		
		for(int i=0; i < listaTransizioni.size(); i++)
			if(listaTransizioni.get(i).sincrona()==true) // se � sincrona
				transizioniSincrone.add(listaTransizioni.get(i));
		
		return transizioniSincrone;
	}
	
	public Stato getStatoCorrente() {
		return statoCorrente;
	}

	//@ requires non_null statoCorrente
	public void setStatoCorrente(Stato statoCorrente) {
		this.statoCorrente = statoCorrente;
	}

	public Stato getStatoIniziale() {
		return statoIniziale;
	}

	//@ requires non_null statoInizianle
	public void setStatoIniziale(Stato statoIniziale) {
		this.statoIniziale = statoIniziale;
		// di default l'iniziale � il corrente
		this.statoCorrente=this.statoIniziale;
	}

	public Vector<Stato> getListaStati() {
		return listaStati;
	}

	//@ requires non_null listaStati
	public void setListaStati(Vector<Stato> listaStati) {
		this.listaStati = listaStati;
	}

	public Vector<Transizione> getListaTransizioni() {
		return listaTransizioni;
	}

	//@ requires non_null listaTransizioni
	public void setListaTransizioni(Vector<Transizione> listaTransizioni) {
		this.listaTransizioni = listaTransizioni;
	}
	
	public String toString(){
		String ret;
		
		ret="Stato iniziale: "+ statoIniziale;
		
		ret= ret + "\n\nLista stati:\n\n";
			
			for(int i=0; i < listaStati.size(); i++){
				ret= ret + "Nome stato: " + listaStati.get(i).toString() + "\n";
			}	
		
		ret=ret + "\n\nLista transizioni:\n\n";
		
		for(int i=0; i < listaTransizioni.size(); i++){
			ret= ret + listaTransizioni.get(i).toStringDet() + "\n";
		}
		
		return ret;
	}
	
	public void eliminaMacchina(){
		statoCorrente=null;
		statoIniziale=null;
		listaStati.removeAllElements();
		listaTransizioni.removeAllElements();
	}
	
}

